module klang.编译.绑定.绑定_;
import 全局;
import klang.编译.语法节点.节点_: 节点_, 节点数组_, 源文件_;
import klang.编译.类型.类型_: 编译选项基类_, 绑定函数_, 绑定子函数_, 符号表_, 符号_, 前端接口_, 程序主机接口_, 遍历节点函数类型_;
import klang.编译.类型.枚举值.枚举值_: TK;
import 核心 = klang.编译.核心.核心_;
alias 整数_ = long;
alias 创建符号函数类型_ = 符号_ delegate(long, dstring);
long 符号数量 = 0;
void delegate(源文件_, 程序主机接口_) 绑定器;
static this() {
    绑定器 = .创建绑定();
}
void 绑定源文件(源文件_ file, 程序主机接口_ 主机) {
    .绑定器(file, 主机);
}
符号_ 创建符号(TK 目标, long 标志, dstring 名称) {
    ++符号数量;
    return new 符号_(目标, 标志, 名称);
}
void delegate(源文件_, 程序主机接口_) 创建绑定() {
    void delegate(源文件_, 程序主机接口_) _绑定源文件;
    void delegate(节点_) 绑定;
    源文件_ file;
    节点_ parent;
    程序主机接口_ host;
    绑定函数_ 绑定工作站;
    绑定函数_ 绑定子工作站;
    void _绑定源文件·func(源文件_ f, 程序主机接口_ 主机) {
        void delegate() 清理;
        file = f;
        host = 主机;
        绑定工作站 = 主机.获取前端().获取绑定工作站(cast(绑定子函数_)(绑定), host);
        绑定子工作站 = 主机.获取前端().获取绑定子工作站();
        if ((file.本地组 is null) || (file.本地组.原型 is ··null!(符号_[dstring]))) {
            绑定(file);
        }
        清理 = 主机.获取前端().获取绑定清理();
        清理();
    }
    _绑定源文件 = &_绑定源文件·func;
    void 绑定·func(节点_ node = ··null!(节点_)) {
        节点_ 储存父节点;
        if (node is ··null!(节点_)) {
            return;
        }
        储存父节点 = parent;
        node.父节点 = parent;
        绑定工作站(node);
        parent = node;
        绑定子工作站(node);
        parent = 储存父节点;
        return;
    }
    绑定 = &绑定·func;
    return cast(void delegate(源文件_, 程序主机接口_))(_绑定源文件);
}
